﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Caching;
using System.Web;
using System.Web.UI.WebControls;
using Controllerss;
using Core.Contract.DataContract;
using www.Controllers;
//using www.SService;

namespace www.Admin
{
    public partial class Contact : System.Web.UI.Page
    {
        #region Value

        private static long _id;
        private static long _isanswer;
        static bool _inserted = false;
        private readonly ObjectCache _cache = MemoryCache.Default;
        //private readonly HyServicesClient _service1 = new HyServicesClient();
        private readonly ContactController _contactControllers=new ContactController();
        private readonly Utility _utility = new Utility();
        #endregion
        #region Contructor

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Convert.ToInt32(Session["role"]) != 1 && Convert.ToInt32(Session["role"]) != 2)
            {
                Message("Bạn không đủ quyền để thực hiện chức năng này.");
                Response.Redirect("Default.aspx");
            }
            if (!IsPostBack)
            {
                Loaddata();
                Loaddatainfo();
            }
        }
        #endregion
        #region Event
        protected void lbtdel_Click(object sender, EventArgs e)
        {
            Delete();
        }
        protected void lbtrefresh_Click(object sender, EventArgs e)
        {
            Loaddata();
        }
        protected void grid_contact_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                var lData = (List<RelaxContactDataContract>)_cache["Contact"];

                if (e.CommandName == "cmd_answer")
                {
                    _isanswer = Convert.ToInt32(e.CommandArgument);
                    Insert();
                    var first = lData.FirstOrDefault(p => p.Id == _isanswer);
                    if (first != null)
                    {
                        txtmailto.Value = first.Email;
                        txtname.Value = first.Title;
                    }
                }
                else if (e.CommandName == "cmd_delete")
                {
                    if (_contactControllers.Delete(new List<long> { Convert.ToInt32(e.CommandArgument) }))
                    {
                        var first = lData.FirstOrDefault(p => p.Id == Convert.ToInt32(e.CommandArgument));
                        if (first != null)
                        {
                            lData.Remove(first);
                            _cache["Contact"] = lData;
                        }
                        Loaddata();
                        Message("Có 1 bản ghi đã được xóa thành công !");
                        Loaddata();
                    }
                    else
                    {
                        Message("Không Có bản ghi nào được xóa  !");
                    }
                }
                else if (e.CommandName == "cmd_active")
                {
                    var first = lData.FirstOrDefault(p => p.Id == Convert.ToInt32(e.CommandArgument));
                    if (first != null)
                    {
                        first.Active = first.Active == 1 ? 0 : 1;
                        _contactControllers.Update(first);
                        _cache["Contact"] = lData;
                        Loaddata();
                    }
                }
                else if (e.CommandName == "cmd_detail")
                {
                    var lReturn = lData.Where(p => p.Id == Convert.ToInt32(e.CommandArgument));
                    frvcontact.DataSource = lReturn;
                    frvcontact.DataBind();
                    pnfeedback.Visible = false;
                    pnview.Visible = false;
                    pndetail.Visible = true;
                }
            }
            catch { }
        }

        protected void lbtback_Click(object sender, EventArgs e)
        {
            try
            {
                Back();
            }
            catch (Exception)
            {

            }

        }
        protected void lbtsend_Click(object sender, EventArgs e)
        {
            try
            {
                Send();
            }
            catch (Exception)
            {

            }

        }
        protected void lbthuy_Click(object sender, EventArgs e)
        {
            Donew();
        }

        protected void lbtinsertinfo_Click(object sender, EventArgs e)
        {
            try
            {
                Insertinfo();
            }
            catch (Exception)
            {

            }
        }

        protected void lbtdeleteinfo_Click(object sender, EventArgs e)
        {
            try
            {
                Deleteinfo();
            }
            catch (Exception)
            {

            }

        }

        protected void lbtrefressinfo_Click(object sender, EventArgs e)
        {
            try
            {
                Loaddatainfo();
            }
            catch (Exception)
            {

            }

        }

        protected void grid_info_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                var lData = (List<RelaxContactDataContract>)_cache["Contact"];
                if (e.CommandName == "cmd_edit")
                {
                    _id = Convert.ToInt32(e.CommandArgument);
                    var first = lData.FirstOrDefault(p => p.Id == _id);
                    if (first != null)
                    {
                        txttitleinfo.Value = first.Title;
                        txtcompanyinfo.Value = first.Company;
                        txtdetailContact.Value = HttpUtility.HtmlDecode(first.Detail);
                        txtdateinfo.Text = first.Date.ToShortDateString();
                        chkactiveinfo.Checked = first.Active == 1;
                    }
                    pnviewinfo.Visible = false;
                    pncontrolinfo.Visible = true;
                    pndetaiinfo.Visible = false;
                    _inserted = false;
                }
                else if (e.CommandName == "cmd_delete")
                {
                    if (_contactControllers.Delete(new List<long> { Convert.ToInt32(e.CommandArgument) }))
                    {
                        var first = lData.FirstOrDefault(p => p.Id == Convert.ToInt32(e.CommandArgument));
                        if (first != null)
                        {
                            lData.Remove(first);
                            _cache["Contact"] = lData;
                        }
                        Loaddatainfo();
                        Message("Có 1 bản ghi đã được xóa thành công !");
                    }
                    else
                    {
                        Message("Không Có bản ghi nào được xóa  !");
                    }
                }
                else if (e.CommandName == "cmd_active")
                {
                    var first = lData.FirstOrDefault(p => p.Id == Convert.ToInt32(e.CommandArgument));
                    if (first != null)
                    {
                        first.Active = first.Active == 1 ? 0 : 1;
                        _contactControllers.Update(first);
                        _cache["Contact"] = lData;
                        Loaddatainfo();
                    }
                }
                else if (e.CommandName == "cmd_detail")
                {
                    var lReturn = lData.Where(p => p.Id == Convert.ToInt32(e.CommandArgument));
                    frv_detailinfo.DataSource = lReturn;
                    frv_detailinfo.DataBind();
                    pnviewinfo.Visible = false;
                    pncontrolinfo.Visible = false;
                    pndetaiinfo.Visible = true;
                }
            }
            catch { }
        }

        protected void lbtsaveinfo_Click(object sender, EventArgs e)
        {
            try
            {
                Save();
            }
            catch (Exception)
            {

            }

        }
        
        protected void lbtdonewinfo_Click(object sender, EventArgs e)
        {
            Donewinfo();
        }

        protected void lbtbackinfo_Click(object sender, EventArgs e)
        {
            Backinfo();
        }

        #endregion

        #region Business

        void Loaddata()
        {
            if (_cache["Contact"] == null)
            {
                var lData = _contactControllers.GetContactDataContracts();
                if (lData.Any())
                {
                    var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddHours(27) };
                    _cache.Set("Contact", lData.ToList(), policy);
                }
            }

            var lData1 = (List<RelaxContactDataContract>)_cache["Contact"];
            if (lData1 != null)
            {
                grid_contact.DataSource = lData1.Where(p => p.Type == 2).ToList();
            }
            grid_contact.DataBind();
        }
        void Loaddatainfo()
        {
            if (_cache["Contact"] == null)
            {
                var lData = _contactControllers.GetContactDataContracts();
                if (lData.Any())
                {
                    var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddHours(27) };
                    _cache.Set("Contact", lData.ToList(), policy);
                }
            }

            var lData1 = (List<RelaxContactDataContract>)_cache["Contact"];
            if (lData1 != null)
            {
                grid_info.DataSource = lData1.Where(p => p.Type == 1).ToList();
            }
            grid_info.DataBind();
        }

        void Insert()
        {
            pnview.Visible = false;
            pnfeedback.Visible = true;
            pndetail.Visible = false;
            Donew();

        }

        void Delete()
        {
            try
            {
                if (grid_contact.Rows.Count > 0)
                {
                    var lId = new List<long>();
                    for (int i = 0; i < grid_contact.Rows.Count; ++i)
                    {
                        var ok = ((CheckBox)grid_contact.Rows[i].FindControl("chkselect")).Checked;
                        if (ok)
                        {
                            var id = ((Label)grid_contact.Rows[i].FindControl("lblid")).Text;
                            if (!string.IsNullOrEmpty(id))
                            {
                                lId.Add(Convert.ToInt32(id));
                            }
                        }
                    }
                    if (lId.Any())
                    {
                        if (_contactControllers.Delete(lId))
                        {
                            var lData = (List<RelaxContactDataContract>)_cache["Contact"];
                            if (lData == null)
                                lData = new List<RelaxContactDataContract>();
                            foreach (var id in lId)
                            {
                                var first = lData.FirstOrDefault(p => p.Id == id);
                                if (first != null)
                                {
                                    lData.Remove(first);
                                }
                            }
                            _cache["Contact"] = lData;

                            Message("Có " + lId.Count + " bản ghi đã được xóa thành công !");
                            Loaddata();
                        }
                        else
                        {
                            Message("Không Có bản ghi nào được xóa  !");
                        }
                    }
                    else
                    {
                        Message("Không Có bản ghi nào được xóa  !");
                    }
                }
            }
            catch { }
        }

        private void Back()
        {
            pndetail.Visible = false;
            pnfeedback.Visible = false;
            pnview.Visible = true;
            pnMessage.Visible = false;
            _isanswer = 0;
            Loaddata();
        }

        void Send()
        {

            var id = _isanswer;
            var title = txtname.Value;
            var mailto = txtmailto.Value;
            var detail = txtdetail1.Value;
            var mailfrom = txtmailfrom.Value;
            var password = txtpassword.Value;

            if (string.IsNullOrEmpty(detail) || string.IsNullOrEmpty(mailfrom) || string.IsNullOrEmpty(password))
            {
                //Message("Các trường trên không được để trống.");
                lblMessage.InnerText = "Các trường trên không được để trống.";
                pnMessage.Visible = true;
                return;
            }
            if (_utility.IsValidEmail(txtmailfrom.Value))
            {
                //Message("mail không đúng định dạng.");
                lblMessage.InnerText = "mail không đúng định dạng.";
                pnMessage.Visible = true;
                return;
            }
            var ok = _utility.SendMail(mailfrom, password, mailto, detail, title);
            if (!ok)
            {
                // Message("Chưa gửi được mail.");
                lblMessage.InnerText = "Chưa gửi được mail.";
                pnMessage.Visible = true;
                return;
            }

            var lData = (List<RelaxContactDataContract>)_cache["Contact"];
            var first = lData.FirstOrDefault(p => p.Id == Convert.ToInt32(id));
            if (first != null)
            {
                first.IsAnswer = 1;
                _contactControllers.Update(first);
                _cache["Contact"] = lData;
            }
        }

        void Donew()
        {
            txtmailfrom.Value = "";
            txtmailto.Value = "";
            txtname.Value = "";
            txtdetail1.Value = "";
            txtmailfrom.Focus();
        }
        void Insertinfo()
        {
            pnviewinfo.Visible = false;
            pncontrolinfo.Visible = true;
            pndetaiinfo.Visible = false;
            pnMesageInfo.Visible = false;
            _inserted = true;
        }

        void Deleteinfo()
        {
            try
            {
                if (grid_info.Rows.Count > 0)
                {
                    var lId = new List<long>();

                    for (var i = 0; i < grid_info.Rows.Count; ++i)
                    {
                        var ok = ((CheckBox)grid_info.Rows[i].FindControl("chkselect")).Checked;
                        if (ok)
                        {
                            var id = ((Label)grid_info.Rows[i].FindControl("lblid")).Text;
                            if (!string.IsNullOrEmpty(id))
                                lId.Add(Convert.ToInt32(id));
                        }
                    }
                    if (lId.Any())
                    {
                        if (_contactControllers.Delete(lId))
                        {
                            var lData = (List<RelaxContactDataContract>)_cache["Contact"];
                            if (lData == null)
                                lData = new List<RelaxContactDataContract>();
                            foreach (var id in lId)
                            {
                                var first = lData.FirstOrDefault(p => p.Id == id);
                                if (first != null)
                                {
                                    lData.Remove(first);
                                }
                            }
                            _cache["Contact"] = lData;
                            pnMesageInfo.Visible = true;
                            lblMessageInfo.InnerText = "Có " + lId.Count + " bản ghi đã được xóa thành công !";
                            // Message("Có " + lId.Count + " bản ghi đã được xóa thành công !");
                            Loaddatainfo();
                        }
                        else
                        {
                            //Message("Không Có bản ghi nào được xóa  !");
                            pnMesageInfo.Visible = true;
                            lblMessageInfo.InnerText = "Không Có bản ghi nào được xóa  !";
                        }
                    }
                    else
                    {
                        //Message("Không Có bản ghi nào được xóa  !");
                        pnMesageInfo.Visible = true;
                        lblMessageInfo.InnerText = "Không Có bản ghi nào được xóa  !";
                    }
                }
            }
            catch { }
        }
        void Save()
        {
            try
            {
                var lData = (List<RelaxContactDataContract>)_cache["Contact"];

                if (string.IsNullOrEmpty(txtcompanyinfo.Value) || string.IsNullOrEmpty(txttitleinfo.Value) || string.IsNullOrEmpty(txtdetailContact.Value))
                {
                    // Message("Bạn phải nhập thông tin đầy đủ vào các gợi ý bên trên !");
                    lblMessageInfo.InnerText = "Bạn phải nhập thông tin đầy đủ vào các gợi ý bên trên !";
                    pnMesageInfo.Visible = true;
                }
                else
                {
                    var ac = chkactiveinfo.Checked ? 1 : 0;

                    if (!_inserted)
                    {
                        var contact = new RelaxContactDataContract
                        {
                            Id = _id,
                            Company = txtcompanyinfo.Value,
                            Title = txttitleinfo.Value,
                            Detail = HttpUtility.HtmlEncode(txtdetailContact.Value),
                            Date = DateTime.Parse(string.IsNullOrEmpty(txtdateinfo.Text) ? DateTime.Now.ToShortDateString() : txtdateinfo.Text),
                            Active = ac,
                            Type = 1
                        };
                        if (_contactControllers.Update(contact))
                        {
                            var first = lData.FirstOrDefault(p => p.Id == _id);
                            if (first != null)
                            {
                                first.Title = contact.Title;
                                first.Company = contact.Company;
                                first.Detail = contact.Detail;
                                first.Date = contact.Date;
                                first.Active = contact.Active;
                                first.Type = contact.Type;
                            }
                            _cache["Contact"] = lData;
                            lblMessageInfo.InnerText = "Có 1 bản ghi vừa được cập nhập thành công!";
                            pnMesageInfo.Visible = true;
                            //Message("Có 1 bản ghi vừa được cập nhập !");
                        }
                    }
                    else
                    {
                        var contact = new RelaxContactDataContract
                        {
                            Company = txtcompanyinfo.Value,
                            Title = txttitleinfo.Value,
                            Detail = HttpUtility.HtmlEncode(txtdetailContact.Value),
                            Date = DateTime.Parse(string.IsNullOrEmpty(txtdateinfo.Text) ? DateTime.Now.ToShortDateString() : txtdateinfo.Text),
                            Active = ac,
                            Type = 1
                        };
                        var id = _contactControllers.Add(contact);

                        contact.Id = id;
                        if (lData == null)
                            lData = new List<RelaxContactDataContract>();
                        lData.Add(contact);
                        _cache["Contact"] = lData;
                        lblMessageInfo.InnerText = "Có 1 bản ghi vừa được Thêm thành công !";
                        pnMesageInfo.Visible = true;
                        //Message("Có 1 bản ghi vừa được cập nhập !");

                    }
                }
            }
            catch { }
        }

        void Donewinfo()
        {
            txtcompanyinfo.Value = "";
            txtdateinfo.Text = "";
            txttitleinfo.Value = "";
            txtdetailContact.Value = "";
            chkactiveinfo.Checked = false;
            txttitleinfo.Focus();
        }
        void Backinfo()
        {
            pnviewinfo.Visible = true;
            pncontrolinfo.Visible = false;
            pndetaiinfo.Visible = false;
            pnMesageInfo.Visible = false;
            _inserted = false;
            _id = 0;
            Loaddatainfo();
        }

        private void Message(string msg)
        {
            Response.Write("<script>alert('" + msg + "');</script>");
        }
        #endregion
    }
}